home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / encode.s < prev    next >
Text File  |  1999-10-08  |  33KB  |  1,339 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        行のコード化と解釈
  4. ;        < encode.s >
  5. ;
  6. ;    $Id: encode.s,v 3.2  1999 10/ 8(Fri) 21:48:40 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1997-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    tmpcode.equ
  14.     .include    register.equ
  15.     .include    symbol.equ
  16.  
  17.     .cpu    68000
  18.     .text
  19.  
  20.  
  21. ;----------------------------------------------------------------
  22. ;    ラベルを定義する
  23. deflabel00:
  24. ;    move.l    a1,(ERRMESSYM,a6)
  25.     move.b    (SYM_TYPE,a1),d0
  26. ;    beq    ilsymerr_value        ;ST_VALUE
  27.     subq.b    #ST_REAL,d0
  28.     bcs    ilsymerr_local        ;ST_LOCAL
  29.     beq    ilsymerr_real        ;ST_REAL
  30.     subq.b    #ST_REGSYM-ST_REAL,d0
  31.     beq    ilsymerr_regsym        ;ST_REGSYM
  32.     bra    ilsymerr_register    ;ST_REGISTER
  33.  
  34. deflabel::
  35.     movem.l    d0-d2/a0-a2,-(sp)
  36.     tst.b    (ISIFSKIP,a6)
  37.     bne    deflabel9        ;.if不成立部の読み飛ばし中なので定義の必要なし
  38.     move.w    (LABNAMELEN,a6),d1
  39.     bmi    deflabel9        ;定義するラベルがない
  40.     movea.l    (LABNAMEPTR,a6),a0
  41. deflabel7:
  42.     bsr    isdefdsym
  43.     tst.w    d0
  44.     beq    deflabel8        ;すでに登録済
  45.     moveq.l    #ST_VALUE,d2        ;数値シンボル
  46.     bsr    defsymbol        ;新しく登録する
  47.     sf.b    (SYM_FIRST,a6)
  48.     bra    deflabel85
  49.  
  50. deflabel8:
  51.     move.l    a1,(ERRMESSYM,a6)
  52.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  53.                     ;シンボルのタイプ
  54.     bne    deflabel00        ;タイプの異なるシンボルと重複している
  55. ;offsymのときはプレデファインシンボルでなければ二重定義エラーを出さない
  56.     tst.b    (SYM_ATTRIB,a1)        ;(cmpi.b #SA_UNDEF,(SYMATTRIB,a1))
  57.     beq    deflabel81        ;未定義なので問題なし
  58.     cmpi.b    #SA_PREDEFINE,(SYM_ATTRIB,a1)
  59.     beq    redeferr_predefine    ;プレデファインシンボルだった
  60. ;SA_NODET/SA_DEFINE
  61.     tst.b    (OFFSYMMOD,a6)
  62.     beq    redeferr        ;offsym中でないので二重定義エラー
  63.     tst.b    (SYM_FIRST,a1)
  64.     bgt    deflabel81
  65.     tst.b    (OWOFFSYM,a6)        ;offsymのシンボルでない
  66.     bne    redeferr_offsym
  67.     bsr    redefwarn_offsym
  68. deflabel81:
  69.     cmpi.b    #SECT_RLCOMM,(SYM_EXTATR,a1)
  70.     bcc    redeferr        ;.xref/.commシンボルだった
  71. deflabel85:
  72.     tst.b    (OFFSYMMOD,a6)
  73.     beq    deflabel850
  74.     bgt    deflabel_offsym        ;offsymでシンボルあり
  75.     move.b    #1,(SYM_FIRST,a1)    ;offsymのシンボル
  76. deflabel850:
  77.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;定義済シンボル
  78.     move.l    (LTOPLOC,a6),d0        ;ロケーションカウンタ値
  79.     move.l    d0,(SYM_VALUE,a1)
  80.     cmpi.b    #SECT_TEXT,(SECTION,a6)
  81.     bne    deflabel851
  82.     move.l    d0,(LASTSYMLOC,a6)    ;テキストセクションで最後に
  83.                     ;ラベルに定義したロケーションカウンタ値
  84. deflabel851:
  85.     move.b    (ORGNUM,a6),(SYM_ORGNUM,a1)
  86.     move.b    (SECTION,a6),(SYM_SECTION,a1)    ;セクション番号
  87.     beq    deflabel88        ;(定数ならT_SYMDEFは不要)
  88.     move.w    #T_SYMDEF,d0
  89.     bsr    wrtobjd0w        ;シンボル定義
  90.     move.l    a1,d0
  91.     bsr    wrtd0l            ;シンボルへのポインタ
  92. deflabel88:
  93.     tst.b    (LABXDEF,a6)
  94.     beq    deflabel9
  95.     move.b    #SECT_XDEF,(SYM_EXTATR,a1)    ;外部定義する
  96. deflabel9:
  97.     movem.l    (sp)+,d0-d2/a0-a2
  98.     rts
  99.  
  100. ;a1=行頭のシンボル
  101. deflabel_offsym:
  102.     move.b    #1,(SYM_FIRST,a1)    ;offsymのシンボル
  103.     cmpa.l    (OFFSYMSYM,a6),a1
  104.     beq    deflabel_offsym1
  105. ;初期値を与えるシンボルでないとき
  106.     movea.l    a1,a2
  107. ;現在のシンボル(変数)=現在のロケーションカウンタ(定数)+初期値(定数)-仮シンボル値(変数)
  108. ;RPNを作る
  109.     move.l    (LTOPLOC,a6),d1        ;現在のロケーションカウンタ
  110.     add.l    (OFFSYMVAL,a6),d1    ;+初期値
  111.     lea.l    (RPNBUF,a6),a1
  112.     move.w    #RPN_VALUE,(a1)+
  113.     move.l    d1,(a1)+        ;現在のロケーションカウンタ+初期値
  114.     move.w    #RPN_SYMBOL,(a1)+
  115.     move.l    (OFFSYMTMP,a6),(a1)+    ;-仮シンボル
  116.     move.w    #OP_SUB|RPN_OPERATOR,(a1)+    ;オペレータ
  117.     clr.w    (a1)            ;エンドコード(move.w #RPN_END,(a1))
  118.     lea.l    (RPNBUF,a6),a1
  119.     bsr    calcrpn
  120.     movea.l    a2,a1
  121.     tst.w    d0
  122.     beq    deflabel_offsym2    ;定数だった
  123. ;定数でなかった
  124.     move.b    #SA_NODET,(SYM_ATTRIB,a1)    ;値が未定のシンボル
  125.     move.w    #T_EQUEXPR,d0        ;式・アドレスのequ/set
  126.     bsr    wrtobjd0w
  127.     move.l    a1,d0
  128.     bsr    wrtd0l            ;シンボルへのポインタ
  129.     lea.l    (RPNBUF,a6),a1
  130.     moveq.l    #7,d1            ;式のワード数
  131.     moveq.l    #SZ_LONG,d0
  132.     bsr    wrtrpn            ;式を出力
  133.     movea.l    a2,a1
  134.     bra    deflabel88
  135.  
  136. ;初期値を与えるシンボルのとき
  137. deflabel_offsym1:
  138.     movea.l    a1,a2
  139. ;初期値を与えるシンボルの位置のロケーションカウンタを格納する仮のシンボルを確定
  140.     movea.l    (OFFSYMTMP,a6),a1
  141.     clr.w    (SYM_SECTION,a1)    ;(SYM_ORGNUM)
  142.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;定義済シンボル
  143.     move.l    (LTOPLOC,a6),(SYM_VALUE,a1)    ;ロケーションカウンタ値
  144. ;初期値を与えるシンボルを確定
  145.     move.l    (OFFSYMVAL,a6),d1    ;初期値
  146.     movea.l    a2,a1
  147. ;d1=値
  148. ;a1=シンボル
  149. deflabel_offsym2:
  150.     clr.w    (SYM_SECTION,a1)    ;(SYM_ORGNUM)
  151.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;定義済シンボル
  152.     move.l    d1,(SYM_VALUE,a1)    ;シンボル値
  153. ;アセンブルリストに表示するため初期値を出力しておく
  154.     move.w    #T_EQUCONST,d0        ;定数のequ/set
  155.     bsr    wrtobjd0w
  156.     move.l    a1,d0
  157.     bsr    wrtd0l            ;シンボルへのポインタ
  158.     move.l    d1,d0
  159.     bsr    wrtd0l            ;シンボル値
  160.     bra    deflabel88
  161.  
  162.  
  163. ;----------------------------------------------------------------
  164. ;    行のラベル解釈、命令のコード化
  165. ;----------------------------------------------------------------
  166. encodeline::
  167.     lea.l    (LINEBUF,a6),a0
  168.     movea.l    a0,a2
  169.     sf.b    (LABXDEF,a6)
  170.     move.w    #-1,(LABNAMELEN,a6)
  171.     bsr    skipspc
  172.     move.b    (a0),d0            ;行が終了
  173.     beq    encodecmd99
  174.     cmp.b    #'*',d0            ;コメント
  175.     beq    encodecmd99
  176.     cmp.b    #';',d0            ;拡張モードのコメント
  177.     beq    encodecmd99
  178.     cmp.b    #'#',d0
  179.     beq    encodecmd99
  180. encodeline1:
  181.     cmp.b    #'.',d0            ;.xxxx 命令
  182.     beq    encodecmd1
  183.     tst.b    (ISIFSKIP,a6)
  184.     beq    encodeline2
  185.     movea.l    a0,a1            ;ifスキップ中の場合
  186.     moveq.l    #-2,d1            ;ラベルを読み飛ばす
  187. encodeline01:
  188.     addq.w    #1,d1
  189.     move.b    (a1)+,d0
  190.     cmp.b    #'.',d0
  191.     beq    encodeline02
  192.     cmp.b    #':',d0
  193.     beq    encodeline02
  194.     cmp.b    #' ',d0
  195.     bhi    encodeline01
  196. encodeline02:
  197.     subq.l    #1,a1
  198.     tst.w    d1
  199.     bmi    encodecmd9
  200.     bra    encodeline3
  201.  
  202. encodeline2:
  203.     bsr    getword
  204.     tst.w    d2
  205.     bmi    encodecmd9        ;ラベル/命令として使用できない文字
  206. encodeline3:
  207.     cmpi.b    #':',(a1)
  208.     beq    encodeline8        ;xxxx: ラベル
  209.     cmpi.b    #' ',(a2)        ;行がスペースで始まったか?
  210.     bls    encodecmd3        ; xxxx 命令
  211.     move.l    a0,(LABNAMEPTR,a6)    ;(ラベルの場合)
  212.     move.w    d1,(LABNAMELEN,a6)
  213.     bsr    getmaccmd        ;xxxx ラベル/命令(マクロ優先)
  214.     tst.w    d0
  215.     beq    encodeline4
  216.     move.b    (a0),d0            ;ラベルの場合
  217.     cmpi.b    #'@',d0
  218.     beq    deflocal11
  219.     cmpi.b    #'9',d0
  220.     bls    deflocal21
  221.     movea.l    a1,a0
  222.     bsr    skipspc
  223.     bra    encodecmd        ;続く命令の処理へ
  224.  
  225. encodeline4:                ;命令の可能性がある
  226.     movea.l    a1,a0
  227.     bsr    skipspc
  228.     cmpi.b    #'.',(a0)
  229.     bne    encodeline45
  230.     addq.l    #1,a0            ;xxxx.xxxx … 2語目が命令なら1語目はラベル
  231.     bra    encodeline46
  232.  
  233. encodeline45:
  234. ;1語目がcinv/cpush/pmoveで':'がなくて2語目が'.'で始まっていなければ,
  235. ;1語目は命令だったことにする
  236.     movea.l    (CMDTBLPTR,a6),a1    ;d1/a1は次のgetwordで破壊するので使える
  237.     move.l    (SYM_FUNC,a1),d1
  238. ;getwordがa1を破壊するのでa1を使う
  239.     lea.l    (encodeline,pc),a1
  240.     sub.l    a1,d1
  241.     cmp.l    #~cinvpusha-encodeline,d1
  242.     beq    encodeline5        ;1語目がcinv/cpushなので1語目は命令
  243.     cmp.l    #~cinvpushlp-encodeline,d1
  244.     beq    encodeline5        ;1語目がcinv/cpushなので1語目は命令
  245.     cmp.l    #~pmove-encodeline,d1
  246.     beq    encodeline5        ;1語目がpmoveなので1語目は命令
  247. encodeline46:
  248.     bsr    getword
  249.     bsr    getmaccmd
  250.     tst.w    d0
  251.     bne    encodeline5
  252.     tst.l    (CMDTBLPTR,a6)        ;2語目も命令→1語目は命令と同名のラベル
  253.     bne    encodecmd5
  254. encodeline5:
  255.     movea.l    (LABNAMEPTR,a6),a0
  256.     move.w    #-1,(LABNAMELEN,a6)    ;ラベルの取り消し
  257.     bra    encodecmd2        ;1語目が命令だった
  258.  
  259. ;----------------------------------------------------------------
  260. ;    ':'付きラベルの定義
  261. encodeline8:
  262.     move.b    (a0),d0
  263.     cmpi.b    #'@',d0
  264.     beq    deflocal10
  265.     cmpi.b    #'9',d0
  266.     bls    deflocal20
  267. encodeline10:
  268.     addq.l    #1,a1
  269.     cmpi.b    #':',(a1)
  270.     bne    encodeline11
  271.     addq.l    #1,a1
  272.     st.b    (LABXDEF,a6)        ;xxxx:: 外部定義ラベル
  273. encodeline11:
  274.     move.l    a0,(LABNAMEPTR,a6)
  275.     move.w    d1,(LABNAMELEN,a6)
  276.     movea.l    a1,a0
  277.     bsr    skipspc
  278.     cmpi.b    #'.',(a0)
  279.     beq    encodecmd1        ;xxxx: .xxxx
  280.     bsr    getword
  281.     tst.w    d2
  282.     bmi    encodecmd3
  283.     cmpi.b    #':',(a1)
  284.     bne    encodecmd3        ;xxxx: xxxx
  285.     bsr    deflabel        ;xxxx: xxxx: 最初のラベルを定義
  286.     sf.b    (LABXDEF,a6)
  287.     bra    encodeline10
  288.  
  289. ;----------------------------------------------------------------
  290. ;    命令のコード化
  291. encodecmd:
  292.     cmp.b    #'.',(a0)
  293.     bne    encodecmd2
  294. encodecmd1:                ;'.'で始まる名前は命令優先
  295.     addq.l    #1,a0
  296.     bsr    getword
  297.     bsr    getcmdmac        ;命令優先
  298.     bra    encodecmd4
  299.  
  300. encodecmd2:
  301.     bsr    getword
  302. encodecmd3:
  303.     bsr    getmaccmd        ;マクロ優先
  304. encodecmd4:
  305.     tst.w    d0
  306.     bne    encodecmd9        ;命令・マクロの誤り
  307.     tst.l    (CMDTBLPTR,a6)
  308.     beq    encodecmd99        ;命令がない
  309. encodecmd5:                ;オペレーションサイズを得る
  310.     st.b    (CMDOPSIZE,a6)        ;(move.b #SZ_NONE,(CMDOPSIZE,a6))
  311.     movea.l    a1,a0
  312.     cmpi.b    #'.',(a0)
  313.     bne    encodecmd7        ;オペレーションサイズがない
  314.     moveq.l    #$20,d0
  315.     or.b    (1,a0),d0
  316.     moveq.l    #SZ_BYTE,d1
  317.     cmp.b    #'b',d0            ;.b
  318.     beq    encodecmd6
  319.     moveq.l    #SZ_WORD,d1
  320.     cmp.b    #'w',d0            ;.w
  321.     beq    encodecmd6
  322.     moveq.l    #SZ_LONG,d1
  323.     cmp.b    #'l',d0            ;.l
  324.     beq    encodecmd6
  325.     moveq.l    #SZ_SHORT,d1
  326.     cmp.b    #'s',d0            ;.s (short/single)
  327.     beq    encodecmd6
  328.     moveq.l    #SZ_DOUBLE,d1
  329.     cmp.b    #'d',d0            ;.d
  330.     beq    encodecmd6
  331.     moveq.l    #SZ_EXTEND,d1
  332.     cmp.b    #'x',d0            ;.x
  333.     beq    encodecmd6
  334.     moveq.l    #SZ_PACKED,d1
  335.     cmp.b    #'p',d0            ;.p
  336.     beq    encodecmd6
  337.     moveq.l    #SZ_QUAD,d1
  338.     cmp.b    #'q',d0            ;.q
  339.     bne    encodecmd7        ;サイズ名が存在しない
  340. encodecmd6:                ;サイズ指定があった
  341.     moveq.l    #0,d0            ;foo=.low.~などがエラーになるのを避ける
  342.     move.b    (2,a0),d0        ;サイズの直後の文字
  343.     lea.l    (wordtbl,pc),a1        ;語の中に許される文字のテーブル
  344.     tst.b    (a1,d0.w)
  345.     bne    encodecmd7        ;語が続いているのでサイズと見なさない
  346.     move.b    d1,(CMDOPSIZE,a6)
  347.     addq.l    #2,a0
  348.     movea.l    (CMDTBLPTR,a6),a1
  349.     cmpi.b    #ST_MACRO,(SYM_TYPE,a1)
  350.     beq    encodecmd7
  351.     move.b    (SYM_SIZE,a1),d0
  352.     tst.b    (CPUTYPE2,a6)
  353.     beq    encodecmd61
  354.     move.b    (SYM_SIZE2,a1),d0    ;ColdFireのとき使えるサイズ
  355. encodecmd61:
  356.     moveq.l    #1,d2
  357.     lsl.b    d1,d2
  358.     and.b    d0,d2
  359.     beq    encodecmd7
  360.     tst.b    (ISIFSKIP,a6)        ;ifスキップ中のエラー→命令を飛ばして何もしない
  361.     beq    encodecmd71        ;指定できないサイズ
  362. encodecmd7:
  363.     bsr    skipspc
  364.     move.l    a0,(LINEPTR,a6)
  365.     rts
  366.  
  367. encodecmd71:
  368.     move.l    a1,(ERRMESSYM,a6)
  369.     tst.w    (SYM_ARCH,a1)
  370.     beq    encodecmd72
  371.     addq.b    #1,d0            ;$FFか?
  372.     bne    ilsizeerr_op        ;サイズを指定できる命令
  373.     bra    ilsizeerr_op_no        ;$FF:サイズを指定できない命令
  374. encodecmd72:
  375.     addq.b    #1,d0            ;$FFか?
  376.     bne    ilsizeerr_pseudo    ;サイズを指定できない疑似命令
  377.     bra    ilsizeerr_pseudo_no    ;$FF:サイズを指定できない疑似命令
  378.  
  379. encodecmd9:
  380.     tst.b    (ISIFSKIP,a6)        ;ifスキップ中のエラー→命令を飛ばして何もしない
  381.     beq    badopeerr
  382. encodecmd99:                ;命令がない場合
  383.     sf.b    (ISMACRO,a6)
  384.     clr.l    (CMDTBLPTR,a6)
  385.     move.l    a0,(LINEPTR,a6)
  386.     rts
  387.  
  388. ;----------------------------------------------------------------
  389. ;    ローカルラベルの定義
  390. deflocal10:                ;'@@:'
  391.     addq.l    #1,a1
  392. deflocal11:
  393.     tst.b    (ISIFSKIP,a6)
  394.     bne    deflocal30        ;.if不成立部の読み飛ばし中なので定義の必要なし
  395.     cmp.w    #2-1,d1
  396.     bne    badopeerr_local
  397.     cmp.b    #'@',(1,a0)
  398.     bne    badopeerr_local        ;'@@'でない
  399.     moveq.l    #0,d1
  400.     bra    deflocal5
  401.  
  402. deflocal30:
  403.     move.w    #-1,(LABNAMELEN,a6)    ;ラベルの取り消し
  404.     movea.l    a1,a0
  405.     bsr    skipspc
  406.     bra    encodecmd        ;.if不成立部の読み飛ばし中なので定義の必要なし
  407.  
  408. deflocal20:                ;'0:'~'9:'
  409.     addq.l    #1,a1
  410. deflocal21:
  411.     tst.b    (ISIFSKIP,a6)
  412.     bne    deflocal30        ;.if不成立部の読み飛ばし中なので定義の必要なし
  413.     move.w    #256-('9'+1),d0        ;上位バイトを0にすること
  414.     add.b    (a0)+,d0
  415.     bpl    badopeerr_local
  416.     add.b    #10,d0
  417.     bmi    badopeerr_local
  418.     tst.w    d1
  419.     beq    deflocal22        ;1文字
  420.     cmp.w    (LOCALLENMAX,a6),d1
  421.     bcc    badopeerr_local        ;最大桁数を越えている?
  422. deflocal211:
  423.     move.w    d0,d2            ;×1
  424.     add.w    d0,d0            ;×2
  425.     add.w    d0,d0            ;×4
  426.     add.w    d2,d0            ;×5
  427.     add.w    d0,d0            ;×10
  428.     move.w    #256-('9'+1),d2        ;上位バイトを0にすること
  429.     add.b    (a0)+,d2
  430.     bpl    badopeerr_local
  431.     add.b    #10,d2
  432.     bmi    badopeerr_local
  433.     add.w    d2,d0
  434.     subq.w    #1,d1
  435.     bne    deflocal211
  436. deflocal22:
  437.     move.w    d0,d1
  438. deflocal5:
  439.     move.w    #-1,(LABNAMELEN,a6)    ;ラベルの取り消し
  440.     movea.l    a1,a0            ;ラベルの直後(':'があるときは':'の直後)
  441.     bsr    skipspc
  442.     pea.l    (encodecmd,pc)        ;(ラベル定義後のジャンプ先)
  443.     movem.l    d0-d2/a0-a2,-(sp)
  444.     movea.l    (LOCALMAXPTR,a6),a2
  445.     move.w    d1,d2
  446.     add.w    d2,d2
  447.     swap.w    d1
  448.     move.w    (a2,d2.w),d1
  449.     addq.w    #1,(a2,d2.w)        ;ローカル番号を進める
  450.     bsr    isdefdlocsym
  451.     tst.w    d0
  452.     beq    deflabel85        ;すでに登録済み
  453.     bsr    deflocsymbol
  454.     bra    deflabel85        ;ラベル定義を行なう(終わったら命令の処理へ)
  455.  
  456.  
  457. ;----------------------------------------------------------------
  458. ;    オペランドのコード化
  459. ;----------------------------------------------------------------
  460. ;    in :a0=オペランド文字列へのポインタ
  461. ;    out:(OPRBUF-)=コード化されたオペランド
  462. encodeopr::
  463.     lea.l    (OPRBUF,a6),a2
  464.     tst.b    (ISIFSKIP,a6)
  465.     bne    encodeopr99
  466. encodeopr1:
  467.     move.b    (a0),d0
  468.     cmp.b    #' ',d0
  469.     bls    encodeopr9
  470.     cmp.b    #'.',d0
  471.     beq    encodeexop        ;演算子
  472. encodeopr2:
  473.     bsr    getnum
  474.     tst.w    d0
  475.     beq    encodenum        ;数値が得られた
  476.     bpl    encodereal        ;浮動小数点実数が得られた
  477.     bsr    getword
  478.     tst.w    d2
  479.     bpl    encodesymr        ;語が抜き出せた
  480. encodeopr3:
  481.     move.b    (a0)+,d0
  482.     cmp.b    #"'",d0
  483.     beq    encodestr        ;文字列
  484.     cmp.b    #'"',d0
  485.     beq    encodestr        ;文字列
  486.     cmp.b    #'!',d0
  487.     beq    encodeinreal        ;浮動小数点実数内部表記
  488. encodeopr5:
  489.     clr.b    (a2)+            ;1文字のキャラクタ(move.b #OT_CHAR>>8,(a2)+)
  490.     move.b    d0,(a2)+
  491.     cmp.b    #',',d0
  492.     bne    encodeopr1
  493.     bsr    skipspc            ;','の後のスペースをスキップ
  494.     bra    encodeopr1
  495.  
  496. encodeopr9:                ;オペランド終了チェック
  497.     bsr    skipspc
  498.     move.b    (a0)+,d0
  499.     cmp.b    #',',d0            ;スペース後の','を認識する
  500.     bne    encodeopr99
  501.     move.w    #','|OT_CHAR,(a2)+
  502.     bsr    skipspc
  503.     bra    encodeopr1
  504.  
  505. encodeopr99:                ;オペランドが終了した
  506.     clr.w    (a2)            ;(move.w #OT_EOL,(a2))
  507.     rts
  508.  
  509. ;----------------------------------------------------------------
  510. ;    演算子のコード化
  511. encodeexop:
  512.     addq.l    #1,a0
  513.     bsr    getword
  514.     tst.w    d2
  515.     beq    encodesize        ;1文字→サイズ指定
  516.     moveq.l    #1,d1
  517.     lea.l    (opname_tbl,pc),a4
  518. encodeexop1:
  519.     movea.l    a0,a3
  520. encodeexop2:
  521.     move.b    (a4)+,d0
  522.     beq    encodeexop4
  523.     moveq.l    #$20,d2
  524.     or.b    (a3)+,d2
  525.     cmp.b    d0,d2
  526.     beq    encodeexop2
  527. encodeexop3:                ;次の演算子へ
  528.     tst.b    (a4)+
  529.     bne    encodeexop3
  530. encodeexop35:
  531.     addq.b    #1,d1
  532.     tst.b    (a4)
  533.     bpl    encodeexop1
  534. encodeexop_real:            ;演算子が存在しない
  535.     subq.l    #1,a0            ;浮動小数点実数の可能性あり
  536.     bsr    strtox            ;文字列を実数に変換する
  537.     tst.l    d0
  538.     bmi    exprerr            ;変換できなければエラー
  539.     move.w    d0,d3
  540.     bra    encodereal
  541.  
  542. encodeexop4:                ;演算子の場合
  543.     cmpi.b    #'.',(a3)+
  544.     bne    encodeexop35        ;演算子名が終わっていない
  545.     movea.l    a3,a0
  546.     cmp.b    #OPCOUNT,d1
  547.     bcs    encodeexop5
  548.     sub.b    #OPCOUNT,d1
  549.     lea.l    (opconv_tbl,pc),a4
  550.     move.b    (a4,d1.w),d1        ;演算子コードを変換
  551. encodeexop5:
  552.     or.w    #OT_OPERATOR,d1        ;演算子
  553.     move.w    d1,(a2)+
  554.     bra    encodeopr1
  555.  
  556. ;----------------------------------------------------------------
  557. ;    サイズ指定のコード化
  558. encodesize:
  559.     moveq.l    #$20,d0
  560.     or.b    (a0),d0
  561.     move.w    #OT_SIZE|SZ_BYTE,d2
  562.     cmp.b    #'b',d0            ;.b
  563.     beq    encodesize1
  564.     addq.b    #SZ_WORD-SZ_BYTE,d2
  565.     cmp.b    #'w',d0            ;.w
  566.     beq    encodesize1
  567.     addq.b    #SZ_LONG-SZ_WORD,d2
  568.     cmp.b    #'l',d0            ;.l
  569.     beq    encodesize1
  570.     addq.b    #SZ_SHORT-SZ_LONG,d2
  571.     cmp.b    #'s',d0            ;.s (short/single)
  572.     beq    encodesize1
  573.     addq.b    #SZ_DOUBLE-SZ_SHORT,d2
  574.     cmp.b    #'d',d0            ;.d
  575.     beq    encodesize1
  576.     addq.b    #SZ_EXTEND-SZ_DOUBLE,d2
  577.     cmp.b    #'x',d0            ;.x
  578.     beq    encodesize1
  579.     addq.b    #SZ_PACKED-SZ_EXTEND,d2
  580.     cmp.b    #'p',d0            ;.p
  581.     beq    encodesize1
  582.     addq.b    #SZ_QUAD-SZ_PACKED,d2
  583.     cmp.b    #'q',d0            ;.q
  584.     beq    encodesize1
  585.     move.w    #OT_MAC|'u',d2
  586.     cmp.b    #'u',d0            ;.u
  587.     bne    encodeexop_real        ;サイズ名が存在しない
  588. encodesize1:
  589.     move.w    d2,(a2)+
  590.     movea.l    a1,a0
  591.     bra    encodeopr1
  592.  
  593. ;----------------------------------------------------------------
  594. ;    数値データのコード化
  595. encodenum:
  596.     move.l    d1,d0
  597.     add.l    d0,d0
  598.     moveq.l    #0,d0
  599.     addx.l    d2,d0            ;d1>=0かつd2=0またはd1<0かつd2=-1ならば0
  600.     beq    encodenum02        ;32bitで入り切る
  601.     tst.l    d2            ;d2=0でもd1の符号拡張になっていなければ,
  602.     beq    encodenum01        ;OT_VALUEQで64bit出力する
  603.                     ;浮動小数点数に変換するときd2=0かつd1<0は
  604.                     ;正の整数として変換されるようにするため
  605.     move.l    (CMDTBLPTR,a6),d0
  606.     beq    overflowerr        ;命令がない
  607.     movea.l    d0,a1
  608.     move.b    (SYM_SIZE,a1),d0    ;使えないサイズのビットが1
  609.     tst.b    (CPUTYPE2,a6)
  610.     beq    encodenum00
  611.     move.b    (SYM_SIZE2,a1),d0    ;ColdFireで使えないサイズのビットが1
  612. encodenum00:
  613.     tst.b    d0
  614.     bpl    encodenum01        ;SZQがあればPMOVEfd
  615.     and.b    #SZS|SZD|SZX|SZP,d0
  616.     bne    overflowerr        ;浮動小数点命令でない
  617.     move.b    (CMDOPSIZE,a6),d0
  618.     subq.b    #SZ_SHORT,d0
  619.     blo    overflowerr        ;サイズ省略/.s/.d/.x/.p/.qのいずれかではない
  620. encodenum01:
  621.     move.w    #OT_VALUEQ,(a2)+    ;64bit数値
  622.     move.l    d2,(a2)+        ;上位32bit
  623.     move.l    d1,(a2)+        ;下位32bit
  624.     bra    encodeopr1
  625.  
  626. encodenum02:
  627.     cmp.l    #$100,d1
  628.     bcs    encodenum2
  629.     cmp.l    #$10000,d1
  630.     bcs    encodenum1
  631.     move.w    #OT_VALUE,(a2)+        ;32bit数値
  632.     move.l    d1,(a2)+
  633.     bra    encodeopr1
  634.  
  635. encodenum1:
  636.     move.w    #OT_VALUEW,(a2)+    ;16bit数値
  637.     move.w    d1,(a2)+
  638.     bra    encodeopr1
  639.  
  640. encodenum2:
  641.     or.w    #OT_VALUEB,d1        ;8bit数値
  642.     move.w    d1,(a2)+
  643.     bra    encodeopr1
  644.  
  645. ;----------------------------------------------------------------
  646. ;    浮動小数点実数データのコード化
  647. encodereal:
  648.     move.w    #OT_REAL,(a2)+        ;実数データ
  649.     move.w    d3,(a2)+        ;指数部
  650.     move.l    d1,(a2)+        ;仮数部上位
  651.     move.l    d2,(a2)+        ;      下位
  652.     bra    encodeopr1
  653.  
  654. ;----------------------------------------------------------------
  655. ;    シンボル・レジスタ名のコード化
  656. encodesymr:
  657.     cmp.w    #1,d1
  658.     bne    encodesymr2
  659.     move.w    #OT_REGISTER|REG_D0,d2    ;2文字の場合
  660.     moveq.l    #$20,d0
  661.     or.b    (a0),d0
  662.     cmp.b    #'d',d0            ;Dn?
  663.     beq    encodesymr1
  664.     move.b    #REG_A0,d2
  665.     cmp.b    #'a',d0            ;An?
  666.     beq    encodesymr1
  667.     cmp.b    #'s',d0            ;SP?
  668.     bne    encodesymr2
  669.     moveq.l    #$20,d0
  670.     or.b    (1,a0),d0
  671.     cmp.b    #'p',d0
  672.     bne    encodesymr2
  673.     move.w    #OT_REGISTER|REG_SP,(a2)+
  674.     movea.l    a1,a0
  675.     bra    encodeopr1
  676.  
  677. encodesymr1:                ;dn,anの場合
  678.     move.b    (1,a0),d0
  679.     sub.b    #'0',d0
  680.     bcs    encodesymr2
  681.     cmp.b    #7,d0
  682.     bhi    encodesymr2
  683.     add.b    d0,d2
  684.     move.w    d2,(a2)+        ;レジスタ名
  685.     movea.l    a1,a0
  686.     bra    encodeopr1
  687.  
  688. encodesymr2:
  689.     move.b    (a0),d0            ;ラベルの場合
  690.     cmpi.b    #'@',d0
  691.     beq    encodelocal10        ;'@...'はローカルラベル参照
  692.     cmpi.b    #'9',d0
  693.     bls    encodelocal20        ;'[0-9]...'はローカルラベル参照
  694.     move.l    a1,-(sp)
  695.     bsr    isdefdsym        ;定義済みシンボルかどうかチェック
  696.     tst.w    d0
  697.     bne    encodesymr5
  698.     move.b    (SYM_TYPE,a1),d1    ;シンボルタイプ
  699.     bmi    encodereg        ;レジスタ名
  700.     cmpi.b    #ST_REGSYM,d1
  701.     beq    encoderegsym        ;regシンボル
  702. encodesym:
  703.     move.w    #OT_SYMBOL,(a2)+    ;シンボル
  704.     move.l    a1,(a2)+        ;シンボルテーブルへのポインタ
  705.     movea.l    (sp)+,a0
  706.     bra    encodeopr1
  707.  
  708. encodesymr5:                ;未定義シンボルの場合
  709.     moveq.l    #ST_VALUE,d2
  710.     bsr    defsymbol        ;シンボルを登録
  711.     sf.b    (SYM_FIRST,a6)
  712.     bra    encodesym
  713.  
  714. encodereg:                ;レジスタ名
  715.     move.w    #OT_REGISTER,d0
  716.     move.b    (SYM_REGNO,a1),d0
  717.     move.w    d0,(a2)+
  718.     movea.l    (sp)+,a0
  719.     bra    encodeopr1
  720.  
  721. encoderegsym:                ;regシンボル
  722.     move.w    (SYM_DEFLEN,a1),d0
  723.     movea.l    (SYM_DEFINE,a1),a0
  724. encoderegsym1:
  725.     move.w    (a0)+,(a2)+        ;定義内容を転送
  726.     dbra    d0,encoderegsym1
  727.     subq.l    #2,a2
  728.     movea.l    (sp)+,a0
  729.     bra    encodeopr1
  730.  
  731. ;----------------------------------------------------------------
  732. ;    ローカルラベル参照を得る
  733. encodelocal10:                ;@f/@b
  734.     moveq.l    #0,d0
  735.     subq.w    #1,d1
  736.     bmi    iloprerr_local        ;'@'1文字ならエラー
  737.     and.w    #$00FF,d1
  738.     move.w    d1,d2
  739. encodelocal11:
  740.     cmpi.b    #'@',(a0)+
  741.     dbne    d2,encodelocal11
  742.     bne    iloprerr_local        ;最後の一文字以外がすべて'@'でなければエラー
  743. encodelocal12:
  744.     moveq.l    #$20,d2
  745.     or.b    (a0)+,d2
  746.     cmpi.b    #'f',d2            ;'@f' = 0,1,2,…
  747.     beq    encodelocal15
  748.     cmpi.b    #'b',d2            ;'@b' = -1,-2,-3,…
  749.     bne    iloprerr_local        ;'@f','@b'でなければエラー
  750.     not.b    d1            ;neg.b d1;subq.b #1,d1
  751. encodelocal15:
  752.     ori.w    #OT_LOCALREF,d1        ;ローカルラベル参照
  753.     move.w    d1,(a2)+
  754.     move.w    d0,(a2)+
  755.     movea.l    a1,a0
  756.     bra    encodeopr1
  757.  
  758. encodelocal20:                ;0f~9f/0b~9b
  759.     cmp.b    #'$',d0
  760.     beq    encodeopr3        ;'$'は現在のロケーションカウンタ
  761.     move.w    #256-('9'+1),d0        ;上位バイトを0にすること
  762.     add.b    (a0)+,d0
  763.     bpl    iloprerr
  764.     add.b    #10,d0
  765.     bmi    iloprerr
  766.     subq.w    #2-1,d1            ;-1=1文字(0桁),0=2文字(1桁),
  767.                     ;1=3文字(2桁),2=4文字(3桁),3=5文字(4桁)
  768.     beq    encodelocal12        ;1桁なので'f'または'b'のチェックへ
  769.     bcs    iloprerr_local        ;1文字以下はエラー
  770.     move.w    d1,d2
  771.     addq.w    #2-1,d2            ;0=1文字(0桁),1=2文字(1桁),
  772.                     ;2=3文字(2桁),3=4文字(3桁),4=5文字(4桁)
  773.     cmp.w    (LOCALLENMAX,a6),d2
  774.     bhi    iloprerr_local        ;最大桁数を越えている?
  775. encodelocal21:
  776.     move.w    d0,d2            ;×1
  777.     add.w    d0,d0            ;×2
  778.     add.w    d0,d0            ;×4
  779.     add.w    d2,d0            ;×5
  780.     add.w    d0,d0            ;×10
  781.     move.w    #256-('9'+1),d2        ;上位バイトを0にすること
  782.     add.b    (a0)+,d2
  783.     bpl    iloprerr_local
  784.     add.b    #10,d2
  785.     bmi    iloprerr_local
  786.     add.w    d2,d0
  787.     subq.w    #1,d1
  788.     bne    encodelocal21
  789. ;    clr.w    d1
  790.     bra    encodelocal12        ;d1.w=0
  791.  
  792. ;----------------------------------------------------------------
  793. ;    文字列データのコード化
  794. encodestr:
  795.     movea.l    a0,a1
  796.     moveq.l    #-1,d1
  797. encodestr1:
  798.     addq.w    #1,d1
  799.     move.b    (a0)+,d2
  800.     beq    encodestr4
  801.     bmi    encodestr5
  802.     cmp.b    d0,d2
  803.     bne    encodestr1
  804. encodestr2:
  805.     move.w    #OT_STR,d0        ;文字列
  806.     move.b    d1,d0
  807.     move.w    d0,(a2)+
  808.     tst.w    d1
  809.     beq    encodeopr1        ;ヌルストリング
  810.     subq.w    #1,d1
  811.     bset.l    #0,d1            ;(d1.w = even(d1.w) - 1)
  812. encodestr3:
  813.     move.b    (a1)+,(a2)+
  814.     dbra    d1,encodestr3
  815.     bra    encodeopr1
  816.  
  817. encodestr5:
  818.   .if EUCSRC=0
  819.     cmp.b    #$A0,d2
  820.     bcs    encodestr6
  821.     cmp.b    #$E0,d2
  822.     bcs    encodestr1        ;半角カタカナ
  823.   .else
  824.     bra    encodestr1        ;EUC
  825.   .endif
  826. encodestr6:
  827.     addq.w    #1,d1
  828.     tst.b    (a0)+            ;2バイト文字の2バイト目
  829.     bne    encodestr1
  830. encodestr4:
  831.     subq.l    #1,a0            ;文字列の途中で行が終了してしまった
  832.     cmp.b    #'"',d0
  833.     beq    termerr_doublequote
  834.     bra    termerr_singlequote
  835.  
  836. ;----------------------------------------------------------------
  837. ;    浮動小数点実数の内部表記を得る('!xxxx....')
  838. encodeinreal:
  839.     cmpi.b    #'=',(a0)
  840.     beq    encodeopr5        ;!=
  841.     move.l    (CMDTBLPTR,a6),d0
  842.     beq    encodeopr5        ;命令がない
  843.     movea.l    d0,a1
  844.     moveq.l    #0,d0
  845.     moveq.l    #2-1,d3
  846.     tst.b    (SYM_SIZE,a1)        ;使えないサイズのビットが1
  847.     bpl    encodeinreal1        ;SZQがあればPMOVEfd
  848.     moveq.l    #SZS|SZD|SZX|SZP,d0
  849.     and.b    (SYM_SIZE,a1),d0    ;使えないサイズのビットが1
  850.     bne    encodeopr5        ;浮動小数点命令でない
  851.     move.b    (CMDOPSIZE,a6),d0
  852.     bsr    getfplen
  853.     move.w    d1,d3
  854.     bmi    iloprerr        ;データサイズが.s/.d/.x/.pでないのでエラー
  855.     moveq.l    #0,d0
  856. encodeinreal1:
  857.     moveq.l    #0,d1
  858.     moveq.l    #8-1,d2
  859. encodeinreal2:
  860.     move.b    (a0)+,d0        ;16進数の1桁を得る
  861.     cmp.b    #'_',d0
  862.     beq    encodeinreal2
  863.     sub.b    #'0',d0
  864.     bcs    encodeinreal5
  865.     cmp.b    #9,d0
  866.     bls    encodeinreal3        ;0~9
  867.     or.b    #$20,d0
  868.     sub.b    #'a'-('9'+1),d0
  869.     cmp.b    #10,d0            ;a~f
  870.     bcs    encodeinreal5
  871.     cmp.b    #15,d0
  872.     bhi    encodeinreal5
  873. encodeinreal3:
  874.     asl.l    #4,d1
  875.     add.l    d0,d1
  876.     dbra    d2,encodeinreal2
  877.     move.w    #OT_VALUE,(a2)+        ;32bit数値
  878.     move.l    d1,(a2)+
  879.     move.w    #','|OT_CHAR,(a2)+
  880.     subq.w    #1,d3
  881.     bra    encodeinreal1
  882.  
  883. encodeinreal5:
  884.     addq.w    #1,d3
  885.     bne    iloprerr        ;サイズと内部表記の長さが合わない
  886.     cmp.w    #8-1,d2
  887.     bne    iloprerr        ;8桁の倍数でないのでエラー
  888.     subq.l    #2,a2            ;(最後の','は不要)
  889.     subq.l    #1,a0
  890.     bra    encodeopr1
  891.  
  892. ;----------------------------------------------------------------
  893. ;    オペランドとして与えられた数値を得る
  894. ;    in :a0=文字列へのポインタ
  895. ;    out:d0.l=数値が得られれば0/浮動小数点実数が得られれば1/エラーなら-1
  896. ;        d2.l:d1.l=得られた数値     /d3.w:d1.l:d2.l=得られた実数値
  897. getnum::
  898.     moveq.l    #0,d0
  899.     moveq.l    #0,d1
  900.     moveq.l    #0,d2            ;上位32bit
  901.     movea.l    a0,a1
  902.     move.b    (a0)+,d0        ;1文字目を得る
  903.     cmp.b    #'0',d0
  904.     beq    getnum5            ;0...
  905.     bcs    getnum1
  906.     cmp.b    #'9',d0
  907.     bls    getdec            ;1~9…10進数
  908. getnum1:
  909.     cmp.b    #'$',d0
  910.     beq    gethex
  911.     cmp.b    #'@',d0
  912.     beq    getoct
  913.     cmp.b    #'%',d0
  914.     beq    getbin
  915. getnum99:
  916.     movea.l    a1,a0            ;数値が無かったのでポインタを戻す
  917.     moveq.l    #-1,d0
  918.     rts
  919.  
  920. getnum5:                ;'0'で始まる場合
  921.     move.b    (a0)+,d0
  922.     cmp.b    #'x',d0
  923.     beq    gethex            ;0x...
  924.     cmp.b    #'o',d0
  925.     beq    getoct            ;0o...
  926.     cmp.b    #'b',d0
  927.     beq    getbin            ;0b...
  928.     cmp.b    #'f',d0
  929.     beq    getreal            ;0f...
  930.     bra    getdec3            ;'0'で始まる10進数
  931.  
  932. getdec:                    ;xxxx 10進数
  933.     sub.b    #'0',d0
  934. getdec1:
  935. ;d2:d1を10倍してd0を加える
  936.     tst.l    d2
  937.     bne    getdec1_1
  938.     cmp.l    #$19999998,d1        ;$19999999以上は10倍して9加えると溢れる
  939.     bls    getdec1_2
  940. getdec1_1:
  941.     add.l    d1,d1
  942.     addx.l    d2,d2            ;d2:d1=元のd2:d1*2
  943.     bcs    getdec1_4
  944.     moveq.l    #0,d3
  945.     add.l    d1,d0
  946.     addx.l    d2,d3            ;d3:d0=元のd2:d1*2+元のd0
  947.     bcs    getdec1_4
  948.     add.l    d1,d1
  949.     addx.l    d2,d2            ;d2:d1=元のd2:d1*4
  950.     bcs    getdec1_4
  951.     add.l    d1,d1
  952.     addx.l    d2,d2            ;d2:d1=元のd2:d1*8
  953.     bcs    getdec1_4
  954.     add.l    d0,d1
  955.     addx.l    d3,d2            ;d2:d1=元のd2:d1*10+元のd0
  956.     bcc    getdec1_3
  957. getdec1_4:
  958.     bra    getdec4
  959.  
  960. getdec1_2:
  961.     add.l    d1,d1            ;d1=元のd1*2
  962.     add.l    d1,d0            ;d0=元のd1*2+元のd0
  963.     lsl.l    #2,d1            ;d1=元のd1*8
  964.     add.l    d0,d1            ;d1=元のd1*10+元のd0
  965.                     ;10倍する前に$19999998以下に制限してあるので溢れない
  966. getdec1_3:
  967.     moveq.l    #0,d0            ;上位を破壊したのでクリアしておく
  968. getdec2:
  969.     move.b    (a0)+,d0
  970. getdec3:
  971.     cmp.b    #'_',d0
  972.     beq    getdec2
  973.     sub.b    #'0',d0
  974.     bcs    getdec9
  975.     cmp.b    #9,d0
  976.     bls    getdec1
  977. getdec9:                ;数値が終了した
  978.     cmp.b    #'.'-'0',d0
  979.     beq    getdecreal        ;xxxx. は浮動小数点実数の可能性あり
  980.     or.b    #$20,d0
  981.     sub.b    #'a'-'0',d0
  982.     bcs    getdec99
  983.     cmp.b    #'z'-'a',d0
  984.     bls    getdecreal1
  985. getdec99:
  986.     subq.l    #1,a0
  987.     moveq.l    #0,d0
  988.     rts
  989.  
  990. ;記述された整数が64bitを超えたら整数としてはエラーだが
  991. ;    ['0'-'9']*{{'.'['0'-'9']+}|{['.']'e'['+'|'-']['0'-'9']+}}
  992. ;を伴っていれば実数としては有効
  993. getdec4:
  994.     move.b    (a0)+,d0
  995.     cmp.b    #'_',d0
  996.     beq    getdec4
  997.     sub.b    #'0',d0
  998.     bcs    getdec5
  999.     cmp.b    #10,d0
  1000.     bcs    getdec4            ;数字をスキップする
  1001. getdec5:
  1002.     cmp.b    #'.'-'0',d0
  1003.     beq    getdec6            ;小数点があれば直後が数字または指数
  1004.     or.b    #$20,d0
  1005.     cmp.b    #'e'-'0',d0
  1006.     beq    getdec7
  1007.     bra    ilinterr        ;数字の直後が小数点でも指数でもない
  1008.  
  1009. getdec6:
  1010.     move.b    (a0)+,d0
  1011.     sub.b    #'0',d0
  1012.     bcs    ilinterr        ;小数点の直後が数字でも指数でもない
  1013.     cmp.b    #10,d0
  1014.     bcs    getdec8            ;小数点の直後が数字なので実数
  1015.     or.b    #$20,d0
  1016.     cmp.b    #'e'-'0',d0
  1017.     bne    ilinterr        ;小数点の直後が数字でも指数でもない
  1018. getdec7:
  1019.     move.b    (a0)+,d0
  1020.     cmp.b    #'+',d0
  1021.     beq    getdec71
  1022.     cmp.b    #'-',d0
  1023.     bne    getdec72
  1024. getdec71:
  1025.     move.b    (a0)+,d0        ;eの直後が+か-
  1026. getdec72:
  1027.     sub.b    #'0',d0
  1028.     bcs    ilinterr        ;指数が完成していない
  1029.     cmp.b    #10,d0
  1030.     bcc    ilinterr        ;指数が完成していない
  1031. getdec8:
  1032.     movem.l    d1-d2/a0,-(sp)
  1033.     movea.l    a1,a0
  1034.     bsr    strtox            ;文字列を実数に変換する
  1035.     tst.l    d0
  1036.     bmi    ilinterr        ;実数でもなかった
  1037.     lea.l    (12,sp),sp        ;実数だった
  1038.     move.w    d0,d3
  1039.     moveq.l    #1,d0
  1040.     rts
  1041.  
  1042. getdecreal:                ;数値が浮動小数点実数かどうか調べる
  1043. ;ここは['0'-'9']+'.'の直後
  1044. ;['0'-'9']*{{'.'['0'-'9']+}|{['.']'e'['+'|'-']['0'-'9']+}}ならば実数
  1045. ;.eだけで判断してしまうと後で.e??.という演算子が作られたときに困るはずなので,
  1046. ;指数部が完成しているかどうかを正しくチェックすること
  1047.     move.b    (a0),d0
  1048.     sub.b    #'0',d0
  1049.     bcs    getdec99        ;小数点の直後が数字ではないので整数
  1050.     cmp.b    #10,d0
  1051.     bcs    getdecreal5        ;小数点の直後が数字なので実数
  1052.     or.b    #$20,d0
  1053.     cmp.b    #'e'-'0',d0
  1054.     bne    getdec99        ;小数点の直後が数字でも指数でもないので整数
  1055.     move.b    (1,a0),d0
  1056.     cmp.b    #'+',d0
  1057.     beq    getdecreal01
  1058.     cmp.b    #'-',d0
  1059.     bne    getdecreal02
  1060. getdecreal01:
  1061.     move.b    (2,a0),d0        ;eの直後が+か-
  1062. getdecreal02:
  1063.     sub.b    #'0',d0
  1064.     bcs    getdec99        ;指数が完成していない
  1065.     cmp.b    #10,d0
  1066.     bcc    getdec99        ;指数が完成していない
  1067.     bra    getdecreal5
  1068.  
  1069. getdecreal1:
  1070.     cmp.b    #'e'-'a',d0        ;xxxxE は浮動小数点実数
  1071.     bne    getnum99        ;xxxx[A-Z]は数値ではない(ローカルラベル参照)
  1072. getdecreal5:
  1073.     movem.l    d1-d2/a0,-(sp)
  1074.     movea.l    a1,a0
  1075.     bsr    strtox            ;文字列を実数に変換する
  1076.     tst.l    d0
  1077.     bmi    getdecreal9        ;変換できなかった
  1078.     lea.l    (12,sp),sp
  1079.     move.w    d0,d3
  1080.     moveq.l    #1,d0
  1081.     rts
  1082.  
  1083. getdecreal9:                ;変換できなかったので整数とする
  1084.     movem.l    (sp)+,d1-d2/a0
  1085.     bra    getdec99
  1086.  
  1087. getreal:                ;0f.... 浮動小数点実数
  1088.     bsr    strtox            ;文字列を実数に変換する
  1089.     tst.l    d0
  1090.     bmi    getnum99        ;変換できなかった
  1091.     move.w    d0,d3
  1092.     moveq.l    #1,d0
  1093.     rts
  1094.  
  1095. gethex:                    ;$xxxx 16進数
  1096.     move.b    (a0)+,d0
  1097.     cmp.b    #'_',d0
  1098.     beq    gethex
  1099.     sub.b    #'0',d0            ;'$'直後の1文字が16進数でなければエラー
  1100.     bcs    getnum99
  1101.     cmp.b    #9,d0
  1102.     bls    gethex5            ;0~9
  1103.     or.b    #$20,d0
  1104.     sub.b    #'a'-('9'+1),d0
  1105.     cmp.b    #10,d0            ;a~f
  1106.     bcs    getnum99
  1107.     cmp.b    #15,d0
  1108.     bhi    getnum99
  1109. gethex5:
  1110.     cmp.l    #$10000000,d2
  1111.     bcc    ilinterr
  1112.     rol.l    #4,d1
  1113.     moveq.l    #$0F,d3
  1114.     lsl.l    #4,d2
  1115.     and.b    d1,d3
  1116.     or.b    d3,d2
  1117.     eor.b    d3,d1
  1118.     or.b    d0,d1
  1119. gethex6:
  1120.     move.b    (a0)+,d0
  1121.     cmp.b    #'_',d0
  1122.     beq    gethex6
  1123.     sub.b    #'0',d0
  1124.     bcs    getnum9
  1125.     cmp.b    #9,d0
  1126.     bls    gethex5            ;0~9
  1127.     or.b    #$20,d0
  1128.     sub.b    #'a'-('9'+1),d0
  1129.     cmp.b    #10,d0            ;a~f
  1130.     bcs    getnum9
  1131.     cmp.b    #15,d0
  1132.     bls    gethex5
  1133. ;    bra    getnum9
  1134.  
  1135. getnum9:                ;数値が終了した
  1136.     subq.l    #1,a0
  1137.     moveq.l    #0,d0
  1138.     rts
  1139.  
  1140. getoct:                    ;@xxxx 8進数
  1141.     move.b    (a0)+,d0
  1142.     cmp.b    #'_',d0
  1143.     beq    getoct
  1144.     sub.b    #'0',d0            ;'@'直後の1文字が8進数でなければエラー
  1145.     bcs    getnum99
  1146.     cmp.b    #7,d0
  1147.     bhi    getnum99        ;0~7
  1148. getoct5:
  1149.     cmp.l    #$20000000,d2
  1150.     bcc    ilinterr
  1151.     rol.l    #3,d1
  1152.     moveq.l    #$07,d3
  1153.     lsl.l    #3,d2
  1154.     and.b    d1,d3
  1155.     or.b    d3,d2
  1156.     eor.b    d3,d1
  1157.     or.b    d0,d1
  1158. getoct6:
  1159.     move.b    (a0)+,d0
  1160.     cmp.b    #'_',d0
  1161.     beq    getoct6
  1162.     sub.b    #'0',d0
  1163.     bcs    getnum9
  1164.     cmp.b    #7,d0
  1165.     bls    getoct5            ;0~7
  1166.     bra    getnum9
  1167.  
  1168. getbin:                    ;%xxxx 2進数
  1169.     move.b    (a0)+,d0
  1170.     cmp.b    #'_',d0
  1171.     beq    getbin
  1172.     sub.b    #'0',d0            ;'%'直後の1文字が2進数でなければエラー
  1173.     bcs    getnum99
  1174.     cmp.b    #1,d0
  1175.     bhi    getnum99        ;0~1
  1176. getbin5:
  1177.     add.l    d1,d1
  1178.     addx.l    d2,d2
  1179.     bcs    ilinterr
  1180.     or.b    d0,d1
  1181. getbin6:
  1182.     move.b    (a0)+,d0
  1183.     cmp.b    #'_',d0
  1184.     beq    getbin6
  1185.     sub.b    #'0',d0
  1186.     bcs    getnum9
  1187.     cmp.b    #1,d0
  1188.     bls    getbin5            ;0~1
  1189.     bra    getnum9
  1190.  
  1191.  
  1192. ;----------------------------------------------------------------
  1193. ;    サブルーチン
  1194. ;----------------------------------------------------------------
  1195.  
  1196. ;----------------------------------------------------------------
  1197. ;    文字列から1語を抜き出す
  1198. ;    in :a0=文字列を指すポインタ
  1199. ;    out:a1=抜き出した語の次の文字を指すポインタ
  1200. ;        d1.w=抜き出した語の長さ-1/d2.w=語として抜き出せない文字なら-1
  1201. getword::
  1202.     moveq.l    #0,d0
  1203.     movea.l    a0,a1
  1204.     moveq.l    #-2,d1
  1205. getword1:
  1206.     move.b    (a1)+,d0
  1207.     move.b    (wordtbl,pc,d0.w),d0
  1208.     beq    getword8        ;語に使えない文字
  1209.     bgt    getword1        ;語に使える文字
  1210.     tst.b    (a1)+            ;2バイト文字の1バイト目
  1211.     bne    getword1
  1212. getword8:
  1213.     add.w    a1,d1
  1214.     sub.w    a0,d1            ;語の長さ-1
  1215.     move.w    d1,d2
  1216.     bpl    getword9
  1217.     clr.w    d1
  1218.     rts
  1219.  
  1220. getword9:
  1221.     subq.l    #1,a1
  1222.     rts
  1223.  
  1224. wordtbl:                ;語の中に許される文字のテーブル
  1225.     .dc.b    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0        ;
  1226.     .dc.b    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0        ;
  1227.     .dc.b    0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0        ;    $           
  1228.     .dc.b    1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1        ;0123456789     ?
  1229.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1        ;@ABCDEFGHIJKLMNO
  1230.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1        ;PQRSTUVWXYZ \  _
  1231.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1        ;`abcdefghijklmno
  1232.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0        ;pqrstuvwxyz   ~
  1233.   .if EUCSRC=0
  1234.     .dc.b    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  1235.     .dc.b    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  1236.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1237.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1238.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1239.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1240.     .dc.b    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  1241.     .dc.b    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  1242.   .else
  1243.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1244.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1245.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1246.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1247.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1248.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1249.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1250.     .dc.b    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
  1251.   .endif
  1252.  
  1253.  
  1254. ;----------------------------------------------------------------
  1255.     .end
  1256.  
  1257. ;----------------------------------------------------------------
  1258. ;    $Log: encode.s,v $
  1259. ;    Revision 3.2  1999 10/ 8(Fri) 21:48:40 M.Kamada
  1260. ;    +86 外部参照宣言したシンボルを行頭ラベルとして再定義しようとするとバスエラーになる不具合
  1261. ;    +86 ilsymerrを細分化
  1262. ;    +86 ilsizeerrを細分化
  1263. ;    +86 EUC対応準備
  1264. ;
  1265. ;    Revision 3.1  1999  6/ 9(Wed) 20:14:38 M.Kamada
  1266. ;    +85 演算子!=を有効にする
  1267. ;
  1268. ;    Revision 3.0  1999  3/19(Fri) 16:30:23 M.Kamada
  1269. ;    +83 「ローカルラベルの参照が不正です」を追加
  1270. ;    +83 数字ローカルラベルの最大桁数を4桁まで選択可能
  1271. ;    +83 foo=.low.~などがエラーになる不具合を回避
  1272. ;
  1273. ;    Revision 2.9  1999  3/ 2(Tue) 20:45:47 M.Kamada
  1274. ;    +82 エラーメッセージを日本語化
  1275. ;    +82 skiphasspcを廃止
  1276. ;    +82 getwordを最適化
  1277. ;
  1278. ;    Revision 2.8  1999  2/27(Sat) 23:39:29 M.Kamada
  1279. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  1280. ;
  1281. ;    Revision 2.7  1999  2/25(Thu) 04:59:19 M.Kamada
  1282. ;    +80 ColdFire対応
  1283. ;    +80 .sizeof.追加
  1284. ;    +80 .offsym <初期値>,<シンボル>
  1285. ;
  1286. ;    Revision 2.6  1998  8/22(Sat) 15:44:53 M.Kamada
  1287. ;    +75 数字ローカルラベルが定義できなくなっていた
  1288. ;
  1289. ;    Revision 2.5  1998  8/20(Thu) 23:47:22 M.Kamada
  1290. ;    +74 .if不成立部に間違ったローカルラベル(999:など)があるとエラーが出る 
  1291. ;
  1292. ;    Revision 2.4  1998  3/31(Tue) 02:18:51 M.Kamada
  1293. ;    +63 wrt~が届かなくなったのでencode.sのdeflabelをソースの先頭に移動
  1294. ;
  1295. ;    Revision 2.3  1998  1/24(Sat) 21:12:06 M.Kamada
  1296. ;    +57 疑似命令.sizemを追加
  1297. ;
  1298. ;    Revision 2.2  1998  1/10(Sat) 15:59:06 M.Kamada
  1299. ;    +56 MOVE to USPのエラッタを回避
  1300. ;
  1301. ;    Revision 2.1  1997 11/ 1(Sat) 19:58:30 M.Kamada
  1302. ;    +53 1.wがエラーになる不具合
  1303. ;
  1304. ;    Revision 2.0  1997 10/28(Tue) 17:11:16 M.Kamada
  1305. ;    +52 PMOVE.D #imm,CRPが正しくアセンブルできない不具合
  1306. ;    +52 記述された整数が64bitを超えたらエラー
  1307. ;    +52 1.E+10がエラーになる不具合
  1308. ;
  1309. ;    Revision 1.9  1997  9/15(Mon) 16:47:07 M.Kamada
  1310. ;    +46 ST_VALUE=0で最適化,aslも最適化
  1311. ;
  1312. ;    Revision 1.8  1997  7/20(Sun) 03:12:08 M.Kamada
  1313. ;    +41 リロケートできない所を修正
  1314. ;
  1315. ;    Revision 1.7  1997  6/24(Tue) 22:15:40 M.Kamada
  1316. ;    +33 プレデファインシンボルCPUに対応
  1317. ;
  1318. ;    Revision 1.6  1997  5/12(Mon) 22:27:15 M.Kamada
  1319. ;    +31 行頭にcpusha dcと書くとエラーになる不都合を修正
  1320. ;
  1321. ;    Revision 1.5  1997  3/20(Thu) 16:04:35 M.Kamada
  1322. ;    +11 2桁の数字ローカルラベルが使えるようにした
  1323. ;    +23 terminator not foundをエラーに
  1324. ;
  1325. ;    Revision 1.4  1994/07/10  11:10:54  nakamura
  1326. ;    コメント開始キャラクタの追加('#')
  1327. ;    データサイズコード'.q'の追加
  1328. ;
  1329. ;    Revision 1.3  1994/06/09  15:07:10  nakamura
  1330. ;    シンボルに'$'を使えるようにした。
  1331. ;
  1332. ;    Revision 1.2  1994/02/24  11:24:22  nakamura
  1333. ;    ローカルラベル最後のコロンを忘れると二重定義でエラーになるのを修正した。
  1334. ;
  1335. ;    Revision 1.1  1994/02/15  11:55:44  nakamura
  1336. ;    Initial revision
  1337. ;
  1338. ;
  1339.